#ifndef CROPPINGALGORITHM_H
#define CROPPINGALGORITHM_H

#include <QObject>
#include <QImage>
#include <QRect>
#include "CroppingSettingsForm.h"
#include "ImageProcessingAlgorithmBase.h"

/**
 * @brief The CroppingAlgorithm class
 * 图像裁剪算法类，用于裁剪图像的指定区域
 */
class CroppingAlgorithm : public ImageProcessingAlgorithmBase
{
   Q_OBJECT
   Q_INTERFACES(ImageProcessingAlgorithmBase)
   Q_PLUGIN_METADATA(IID IMAGEPROCESSINGALGORITHMBASE_IID)
public:
    Q_INVOKABLE CroppingAlgorithm(QObject *parent = nullptr);
    ~CroppingAlgorithm() override;

    /**
     * @brief 设置输入图像
     * @param imageId 图像唯一标识符
     * @param inputImage 输入的原始图像
     */
    void setInputImage(const QString &imageId, const QImage &inputImage) override;

    /**
     * @brief 执行图像处理
     * 处理结果将通过imageProcessed信号输出
     * @param parameters 处理参数字符串，每个参数之间使用,隔开
     */
    void processImage(const QString& parameters = "") override;
    
    /**
     * @brief 执行图像处理
     * @param preview 是否为预览模式
     * @return 处理后的图像
     */
    QImage processImage(bool preview);
    
    /**
     * @brief 执行实际裁剪
     * 点击确定按钮时调用，执行实际的裁剪操作
     */
    void onExecuteActualCrop();

    /**
     * @brief 获取当前处理的图像ID
     * @return 图像ID
     */
    QString currentImageId() const override;

    /**
     * @brief 设置裁剪区域
     * @param rect 裁剪区域
     */
    void setCropRect(const QRect& rect);

    /**
     * @brief 获取当前裁剪区域
     * @return 裁剪区域
     */
    QRect cropRect() const;

    /**
     * @brief 获取算法名称
     * @return 算法名称
     */
    QString algorithmName() const override;

    /**
     * @brief 初始化算法
     * 用于注册算法widget
     */
    void initialize() override;

    /**
     * @brief 获取算法处理参数
     * @return 包含处理参数的QVariantMap
     */
    QVariantMap getProcessParameters() const override;

    /**
     * @brief 设置算法处理参数
     * @param params 包含处理参数的QVariantMap
     */
    void setProcessParameters(const QVariantMap &params) override;
    
    /**
     * @brief 恢复默认参数
     * 将算法的所有参数恢复到默认设置
     */
    void resetToDefaultParameters() override;

    /**
     * @brief 检查裁剪区域是否有效
     * @param sourceImage 源图像
     * @param rect 裁剪区域
     * @return 是否有效
     */
    static bool isValidCropRect(const QImage& sourceImage, const QRect& rect);
    
    /**
     * @brief 标记裁剪区域
     * @param image 原始图像
     * @param rect 裁剪区域
     * @return 带有裁剪区域标记的图像
     */
    QImage markCropArea(const QImage& image, const QRect& rect);

private:
    QRect m_cropRect; // 裁剪区域
    CroppingSettingsForm* m_settingsForm; // 设置表单指针
    QImage m_inputImage; // 存储输入图像
    QString m_imageId; // 当前处理的图像ID
    bool m_processed; // 处理状态标志
};

#endif // CROPPINGALGORITHM_H
